/*
 * @Author: lirl
 * @Date: 2022-07-18 10:15:54
 * @Description: vue cli配置文件
 */
// vue.config.js
const webpack = require('webpack');
const CompressionPlugin = require('compression-webpack-plugin');
const CopyPlugin = require('copy-webpack-plugin');
const path = require('path'); //引入path模块
const { defineConfig } = require('@vue/cli-service');

const resolve = (dir) => {
  return path.join(__dirname, dir); //path.join(__dirname)设置绝对路径
};

// 是否是开发环境
const isDevEnv = process.env.NODE_ENV === 'dev';

module.exports = defineConfig({
  // 部署应用包时的基本 URL
  publicPath: process.env.VUE_APP_PUBLIC_PATH,
  // 当运行 vue-cli-service build 时生成的生产环境构建文件的目录
  outputDir: process.env.VUE_APP_OUTPUTDIR,
  indexPath: 'index.html',
  // 开发环节配置
  devServer: {
    port: 8082, // 端口地址
    open: false, // 是否自动打开浏览器页面
    host: '0.0.0.0', // 指定使用一个 host，默认是 localhost
    https: false, // 使用https提供服务
    client: {
      overlay: false
    },
  },
  // 是否在开发环境下通过 eslint-loader 在每次保存时 lint 代码。这个值会在 @vue/cli-plugin-eslint 被安装之后生效。
  lintOnSave: 'warning',
  // 默认情况下 babel-loader 会忽略所有 node_modules 中的文件。你可以启用本选项，以避免构建后的代码中出现未转译的第三方依赖。
  transpileDependencies: true,
  // 如果你不需要生产环境的 source map，可以将其设置为 false 以加速生产环境构建。
  productionSourceMap: false,
  css: {
    sourceMap: false
  },
  configureWebpack: {
    // 开发环境生成source-map
    devtool: isDevEnv && 'eval-source-map',
    resolve: {
      extensions: ['.js', '.vue'],
      alias: {
        '@': path.resolve(__dirname, './src')
      }
    },
    optimization: {
      minimize: !isDevEnv,
      // 解决Conflicting values for 'process.env.NODE_ENV'问题
      nodeEnv: false,
      splitChunks: {
        chunks: 'all',
        maxAsyncRequests: 30,
        maxInitialRequests: 30,
        minChunks: 1,
        cacheGroups: {
          index: {
            name: 'index',
            priority: -20,
            reuseExistingChunk: true,
          },
          'defaultVendors': {
            name: 'chunk-vendors',
            test: /[\\/]node_modules[\\/]/,
            priority: -10,
            reuseExistingChunk: true,
          },
          jdfJssdk: {
            name: 'chunk-jdf-jssdk',
            test: /[\\/]node_modules[\\/].*(core-js|jdf-jssdk|jdf-util)[\\/]/,
            priority: 20
          },
          elementUI: {
            name: 'chunk-element-ui',
            test: /[\\/]node_modules[\\/].*element-ui[\\/]/,
            priority: 40
          },
          jdfVueUI: {
            name: 'chunk-jdf-vue-ui',
            test: /[\\/]node_modules[\\/].*jdf-vue-ui[\\/]/,
            priority: 50
          },
          o2oa: {
            name: 'o2oa',
            test: /[\\/]node_modules[\\/].*o2oa[\\/]/,
            priority: 70
          },
          jdfUtils: {
            name: 'chunk-jdf-utils',
            test: /[\\/]node_modules[\\/].*(pinyin-pro|lodash-es|cafe-ofd|vxe-table|xe-utils)[\\/]/,
            priority: 80
          },
          antv: {
            name: 'antv',
            test: /[\\/]node_modules[\\/].*antv[\\/]/,
            priority: 100
          }
        }
      }
    },
    plugins: [
      new CompressionPlugin({
        /* [file]被替换为原始资产文件名。
           [path]替换为原始资产的路径。
           [dir]替换为原始资产的目录。
           [name]被替换为原始资产的文件名。
           [ext]替换为原始资产的扩展名。
           [query]被查询替换。*/
        //压缩算法
        algorithm: 'gzip',
        //匹配文件
        test: /\.js$|\.html$|\.json$|\.css/,
        //压缩超过此大小的文件,以字节为单位
        threshold: 10240
        //删除原始文件只保留压缩后的文件
        // deleteOriginalAssets: true
      }),
      new webpack.optimize.LimitChunkCountPlugin({
        maxChunks: 10
      }),
      new CopyPlugin({
        patterns: [
          { from: 'node_modules/@o2oa/doceditor-ucfg/public', to: 'public' },
          // { from: 'node_modules/apm-anchor/src', to: 'apm-anchor' },
          // { from: 'node_modules/tinymce/skins', to: 'tinymce/skins' }
        ]
      })
    ],
    output: {
      filename: 'js/[name].[fullhash].js',
      chunkFilename: 'js/[name].[fullhash].js'
    }
    // cache: {
    //   // 开启持久化缓存
    //   type: 'filesystem',
    //   buildDependencies: {
    //     config: [__filename]
    //   }
    // }
  },
  chainWebpack: (config) => {
    config.resolve.alias.set('@', resolve('src'));
  }
});
